iT邦幫忙

2024 iThome 鐵人賽

DAY 17
1
Security

資安新手的試煉之路系列 第 17

資安新手的試煉之路 Day 17

  • 分享至 

  • xImage
  •  

今天來介紹x86 Assembly

什麼是 x86 Assembly?

x86 Assembly 是針對 Intel x86 架構的一種低階編程語言。它是最接近硬件的程式語言,直接與計算機的 CPU 和記憶體交互。相對於高階語言(如 C、Python),組合語言提供了對硬體操作的更細粒度控制,適合於性能優化、操作系統開發、反向工程和漏洞利用等領域。

組合語言與機器語言的主要區別在於,組合語言是人類可讀的,它使用助記符(mnemonics)來代表 CPU 的指令,而機器語言是 CPU 直接執行的二進制代碼。

x86 架構背景

x86 是一種指令集架構(Instruction Set Architecture, ISA),最早由 Intel 在 1978 年推出,並廣泛應用於 PC、伺服器以及嵌入式系統中。隨著時間的推移,x86 指令集不斷擴展,加入了如 32 位、64 位模式的支持。

  • 16-bit x86: 最早的 x86 架構,如 Intel 8086。
  • 32-bit x86: 包含 Intel 80386 及後續版本,這個模式也被稱為 IA-32。
  • 64-bit x86: 也稱為 x86-64 或 AMD64,加入了更多的暫存器、更大的內存尋址空間。

x86 的基本概念

  1. 暫存器(Registers)
    暫存器是 CPU 的內部存儲器,用來暫存數據,進行數學運算、邏輯操作等。常見的 x86 暫存器包括:

    • General Purpose Registers (GPR):

      • EAX: 累加器(Accumulator),常用於數學運算。
      • EBX: 基底暫存器(Base Register),常作為資料位址的基礎。
      • ECX: 計數暫存器(Count Register),常用於迴圈計數。
      • EDX: 資料暫存器(Data Register),常用於輸入輸出及數據處理。
    • Segment Registers:

      • CS: 代碼段寄存器(Code Segment),指向當前正在執行的代碼段。
      • DS: 數據段寄存器(Data Segment),指向數據段的起始位置。
      • SS: 堆棧段寄存器(Stack Segment),指向堆棧段的起始位置。
    • 指標暫存器:

      • ESP: 堆棧指標(Stack Pointer),指向當前堆棧頂部。
      • EBP: 基址指標(Base Pointer),常用於函數調用時保存堆棧基址。
  2. 內存模式(Memory Models)
    x86 使用「段:位移」模型來表示內存地址。在這種模型中,段暫存器保存了段的起始地址,而位移值表示該段中的偏移量。

    • 段:位移模式(Segment:Offset):
      這是一種將內存分成多個段的內存尋址方法,如 CS:IP 表示代碼段中的指令指針。
  3. 指令集(Instruction Set)
    x86 指令集包含數百種指令,能執行各種計算、資料移動、邏輯操作以及分支控制等。這裡列出了一些常見的指令:

    • 資料移動指令:

      • MOV: 將資料從一個位置移到另一個位置。
      • PUSHPOP: 堆棧操作指令,用於壓入和彈出資料。
    • 算術指令:

      • ADDSUB: 進行加法與減法。
      • MULDIV: 無號乘法與除法。
    • 邏輯指令:

      • AND, OR, XOR: 執行位元運算。
      • NOT: 取反運算。
    • 控制流指令:

      • JMP: 無條件跳轉。
      • CMP: 比較兩個操作數,並設定標誌。
      • JE, JNE, JG, JL: 根據比較結果進行有條件跳轉。
  4. 旗標暫存器(Flags Register)
    旗標暫存器保存了運算結果的狀態,影響後續指令的執行。常見的旗標有:

    • ZF(Zero Flag): 當運算結果為零時設置。
    • CF(Carry Flag): 用於檢測溢出。
    • OF(Overflow Flag): 當有符號數運算發生溢出時設置。

x86 Assembly 的應用場景

  1. 性能優化
    在需要高性能的場景中,如遊戲引擎、資料壓縮和加密,程序員有時會選擇直接編寫 Assembly 程式來精細控制 CPU 操作,實現極致優化。

  2. 操作系統開發
    組合語言是操作系統內核開發中的重要工具,如在 Linux 核心的啟動過程中,很多底層的初始化和硬件交互部分使用了 x86 Assembly。

  3. 漏洞利用與安全研究
    安全研究者和漏洞利用專家通常會使用 x86 組合語言來理解應用程式的底層運行邏輯,從而發現和利用漏洞。在 CTF 比賽中的 Pwn 題目或逆向工程挑戰,也常涉及對 x86 指令的分析。

  4. 反向工程
    對於閉源的軟件,反向工程可以通過反彙編工具(如 IDA Pro 或 Ghidra)將二進制轉換為 x86 Assembly,讓研究者分析其行為並找出潛在的漏洞。

簡單範例:函數的調用與堆棧操作

讓我們來看一段典型的 x86 程式,它展示了如何通過堆棧調用函數並返回結果:

section .data
    msg db 'Hello, World!', 0

section .text
    global _start
    
_start:
    ; 調用 print 函數
    call print

    ; 退出程序
    mov eax, 60         ; 系統調用號 60: exit
    xor edi, edi        ; 狀態碼 0
    syscall

print:
    ; 將 msg 的地址放入 RDI 參數寄存器
    mov rdi, msg

    ; 調用系統調用 write (號碼 1)
    mov eax, 1          ; 系統調用號 1: write
    mov edi, 1          ; 文件描述符 1: stdout
    mov rsi, msg        ; 緩衝區地址
    mov edx, 13         ; 緩衝區長度
    syscall

    ; 返回主程序
    ret

x86-64 與 x86 的區別

x86-64 是對 x86 指令集的擴展,它支援 64 位內存地址和更多暫存器。主要區別包括:

  • 暫存器名稱:x86-64 增加了 8 個額外的通用暫存器(如 R8-R15)。
  • 更大的地址空間:從 32 位的 4 GB 地址空間擴展到 64 位的理論 16 EB。
  • 系統調用與函數調用規則變化:x86-64 使用不同的參數傳遞規則,函數參數通過暫存器傳遞,而不是傳遞在堆棧中。

常見的工具

  1. NASM (Netwide Assembler): 開源的 x86 組合語言編譯器,支持多種平台,並且編譯速度快。
  2. GDB (GNU Debugger): GNU 開發的強大調試工具,能幫助程序員跟蹤程式的執行過程、檢查內存狀態。
  3. IDA Pro 和 Ghidra: 高級反彙編工具,用於分析二進制文件,生成易於

理解的 x86 組合語言代碼。

結論

x86 Assembly 是一門與硬件緊密結合的低階語言,提供了對 CPU 和記憶體的細緻控制。儘管相較於高階語言,它的編程難度較大,但在性能優化、反向工程和安全研究等領域具有無可替代的價值。學習 x86 Assembly 不僅能讓你更深入理解計算機系統的底層運作,還能為進階領域的探索打下堅實基礎。


上一篇
資安新手的試煉之路 Day 16
下一篇
資安新手的試煉之路Day 18
系列文
資安新手的試煉之路29
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言